﻿using System;
using System.Collections.Generic;
using System.Linq;
using BLToolkit.Data;
using Calendar.Logic.Core;
using Calendar.Logic.ObjectModel;

namespace Calendar.Logic.ObjectManager
{
    internal static class EventNotificationManagerExtended
    {
    }

    public class EventNotificationManager : BaseManager<EventNotificationManager, EventNotification>
    {
        public new List<EventNotification> SelectAll()
        {
            return Table.ToList();
        }

        public new EventNotification SelectById(int id)
        {
            return Table.Where(e => e.ID == id).FirstOrDefault();
        }

        public List<EventNotification> SelectByEventAndUser(int eventId, int userId)
        {
            return Table.Where(e => e.Event == eventId && e.User == userId).ToList(true);
        }

        //public void AddNotifications(int eventId, int userId, string[] titles, int[] whenNotifyValues, bool[] emailNotifyValues)
        //{
        //    var result = new List<EventNotification>();
        //    for (int i = 0; i < titles.Length; i++)
        //    {
        //        var eventNotify = CreateInstance();
        //        eventNotify.Event = eventId;
        //        eventNotify.User = userId;
        //        eventNotify.Title = titles[i];
        //        eventNotify.When = whenNotifyValues[i];
        //        eventNotify.EmailNotify = emailNotifyValues[i];
        //        eventNotify.Sent = false;
        //        result.Add(eventNotify);
        //    }
        //    try
        //    {
        //        InsertBatch(result);
        //    }
        //    catch (DataException ex)
        //    {
        //        throw new ManagerException("Не удалось добавить уведомления.");
        //    }
        //}

        public EventNotification AddNotification(int eventId, int userId, string title, int whenNotify, bool emailNotify)
        {
            var eventNotify = CreateInstance();
            eventNotify.Event = eventId;
            eventNotify.User = userId;
            eventNotify.Title = title;
            eventNotify.When = whenNotify;
            eventNotify.IsEmail = emailNotify;
            eventNotify.Sent = false;
            try
            {
                Insert(eventNotify);
            }
            catch (DataException ex)
            {
                throw new ManagerException("Не удалось добавить уведомления.");
            }
            return eventNotify;
        }

        public void RemoveNotification(int id)
        {
            try
            {
                DeleteByKey(id);
            }
            catch (DataException ex)
            {
                throw new ManagerException("Не удалось удалить уведомление. Уведомление используется в системе.");
            }
        }

        public void EditNotification(int eventId, int userId, int notificationId, string title, int whenNotify, bool emailNotify)
        {
            var eventNotify = SelectById(notificationId);
            eventNotify.Event = eventId;
            eventNotify.User = userId;
            eventNotify.Title = title;
            eventNotify.When = whenNotify;
            eventNotify.IsEmail = emailNotify;
            eventNotify.Sent = false;
            try
            {
                Update(eventNotify);
            }
            catch (DataException ex)
            {
                throw new ManagerException("Не удалось обновит уведомление. Уведомление используется в системе.");
            }
        }


        public void SetSent(EventNotification ev)
        {
            try
            {
                ev.Sent = true;
                Update(ev);
            }
            catch (DataException)
            {
                throw new ManagerException("Данное событие используется в системе");
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="now"></param>
        /// <param name="interval">в минутах</param>
        /// <returns></returns>
        public List<EventNotification> SelectNotSentOnNow(DateTime now, int interval)
        {
            var result = new List<EventNotification>();
            var allEvents = EventManager.Table.ToList();
            foreach (var ev in allEvents)
            {
                var currentNotSentEvUsers =
                    Table.Where(
                        e =>
                            e.Event == ev.ID &&
                            !e.Sent &&
                            e.When > 0 &&
                            e.IsEmail &&
                            ((ev.Start - now).TotalMinutes - e.When) < interval
                            ).ToList();
                foreach (var tmp in currentNotSentEvUsers)
                    result.Add(tmp);
            }
            return result;
        }

    }
}

